package practica;
import java.util.ArrayList;
import java.util.List;

import aima.search.framework.HeuristicFunction;
import aima.search.framework.Successor;
import aima.search.framework.SuccessorFunction;

/** 
 * Clase generadora de estados succesores para el algoritmo Hill Climbing.
 * @author	Mauro Vime Castillo <mauro.vime@est.fib.upc.edu>, Arnau Soler <arnau.soler@est.fib.upc.edu> y Roger Noguera <roger.noguera@est.fib.upc.edu>
 */
public class EstadosSucesores implements SuccessorFunction {
	
	/**
	* Constructora vacia. 
	*/
	public EstadosSucesores() {}

	/** 
     * Funcion generadora de estados succesores.
     * @param state Estado actual sobre el que generar los sucesores.
     * @return List Lista con todos los estados sucesores.
     */
	@Override
	public List getSuccessors(Object state) {
		EstadoSensores estado = (EstadoSensores)state;
		ArrayList<Successor> sucesores = new ArrayList<Successor>();
		for (int i = 0; i < estado.getnumsens(); ++i) {
			for (int j = 0; j < (estado.getnumsens() + estado.getnumcent()); ++j) { 
				for (int k = 0; k < 3; ++k) {
					EstadoSensores newestado = estado.clonar();
					switch (k) {
					case 0:
						if (newestado.MoverConexion(i,j)) {
							String s = estado.MOV_CONEXION ;
							sucesores.add(new Successor(s,newestado));
						}
						break;
					case 1:
						if (newestado.NuevaConexion(i,j)) {
							String s = estado.NEW_CONEXION;
							sucesores.add(new Successor(s,newestado));
						}
						break;
					case 2:
						if (j == 0 && newestado.EliminarConexion(i)) {
							String s = estado.ELI_CONEXION;
							sucesores.add(new Successor(s,newestado));
						}
					}
				}
			}
		}
		return sucesores;
	}
}

